﻿package pcenshao.commons.simpledb;

import java.util.List;

/**
 * 提供方便的操作单表的功能<br>
 * 
 * @author pengyw
 * 
 */
public interface TableEntityManager extends EntityManager {

	/**
	 * 使用指定的主键值查询table
	 * 
	 * @param table
	 * @param idColumn
	 * @param id
	 * @return
	 */
	public Entity get(String table, String idColumn, Object id);

	/**
	 * 
	 * @param <T>
	 * @param table
	 * @param idColumn
	 * @param id
	 * @param entityClz
	 * @throws NullPointerException
	 *             entityClz=null
	 * @return
	 */
	public <T> T get(String table, String idColumn, Object id,
			Class<T> entityClz);

	/**
	 * 如果希望返回有Entity中包含idColumn,那么必须在columns指定<br>
	 * 
	 * @param table
	 *            表名,不能为null
	 * @param idColumn
	 *            主键列名,不能为null
	 * @param id
	 *            主键值,不能为null
	 * @param columns
	 *            null或者columns.length=0 表示select * from
	 * @return
	 * @throws NullPointerException
	 *             当table=null,或idColumn=null,或id=null时
	 * 
	 */
	public Entity get(String table, String idColumn, final Object id,
			String... columns);

	/**
	 * @param <T>
	 * @param table
	 * @param idColumn
	 * @param id
	 * @param entityClz
	 * @param columns
	 * @throws NullPointerException
	 *             entityClz=null
	 * @return
	 */
	public <T> T get(String table, String idColumn, final Object id,
			Class<T> entityClz, String... columns);

	/**
	 * 分页查询所有列
	 * 
	 * @param tableName
	 * @param offset
	 * @param limit
	 * @return
	 */
	public List<Entity> queryRange(String tableName, int offset, int limit);

	public <T> List<T> queryRange(String table, Class<T> entityClz, int offset,
			int limit);

	public List<Entity> queryRange(String tableName, String[] columns,
			int offset, int limit);

	public <T> List<T> queryRange(String table, Class<T> entityClz,
			String[] columns, int offset, int limit);

	/**
	 * 查询指定列,指定区间的记录
	 * 
	 * @param tableName
	 *            表名,不能为null
	 * @param columns
	 *            null,length=0 => select * from
	 * @param where
	 * @param args
	 * @param offset
	 * @param limit
	 * @throws NullPointerException
	 *             tableName=null
	 * @return
	 */
	public List<Entity> queryRange(String tableName, String[] columns,
			String where, Object[] args, int offset, int limit);

	public <T> List<T> queryRange(String table, Class<T> entityClz,
			String[] columns, String where, Object[] args, int offset, int limit);

	/**
	 * 查询指定表的总记录数
	 * 
	 * @param tableName
	 *            表名,不能为null
	 * @param idColumn
	 *            若为null,则使用select count(1) from
	 * @throws NullPointerException
	 *             tableName=null
	 * @return
	 */
	public int queryTableCount(String tableName, String idColumn);

	/**
	 * 使用where条件查询指定表的记录数
	 * 
	 * @param table
	 *            表名,不能为null
	 * @param idColumn
	 *            主键列名,不能为null,可以指定为1,即select count(1) from xxx
	 * @param where
	 * @param args
	 * @throws NullPointerException
	 *             table=null或idColumn=null
	 * @return
	 */
	public int queryTableCount(String table, String idColumn, String where,
			Object... args);

	/**
	 * 使用where条件查询指定表中的记录
	 * 
	 * @param tableName
	 * @param where
	 *            可以为null,不能以where开头
	 * @param args
	 * @param columns
	 *            null,length=0 => select * from
	 * @return
	 */
	public List<Entity> queryTableList(String tableName, String where,
			Object[] args, String[] columns);

	public <T> List<T> queryTableList(String table, Class<T> entityClz,
			String where, Object[] args, String[] columns);

	/**
	 * 更新数据库,返回受影响的条数
	 * 
	 * @param entity
	 *            不能为null
	 * @param table
	 *            null时,尝试entity.getTableName()
	 * @param idColumn
	 *            null时,尝试entity.getIdColumn()
	 * @param columns
	 *            null或length=0时,尝试entity.getFields()
	 * @throws NullPointerException
	 *             entity=null时
	 * @return
	 */
	public int update(final Entity entity, String table, String idColumn,
			String[] columns);

	/**
	 * 删除指定表的数据
	 * 
	 * @param table
	 *            表名,不能为null
	 * @param idColumn
	 *            主键列名,可以为null,表示删除所有数据
	 * @param value
	 *            主键值,当idColumn为null时,可以为空,其他情况不可以为null
	 * @throws NullPointerException
	 *             table=null
	 * @return
	 */
	public int delete(String table, String idColumn, Object value);

	/**
	 * 将使用Entity.getTableName(),Entity.getIdColumn()和Entity.getIdValue()<br>
	 * 以上任何值为null,都将抛出IllegalArgumentException
	 * 
	 * @param entity
	 *            不能为null
	 * @throws NullPointerException
	 *             entity=null时
	 * @throws IllegalArgumentException
	 */
	public int delete(Entity entity);

	/**
	 * 执行delete语句
	 * 
	 * @param table
	 * @param where
	 *            过滤条件,可以为null,不得以where开头
	 * @param args
	 *            where中的参数
	 * @return
	 */
	public int delete(String table, String where, Object... args);

}
